package com.dave.effcient;

import java.util.Optional;

/**
 * @Author Dave
 * @Date 2018/11/26
 * @Description Optional
 */
public class OptionalTest {

    ///////////////////////////////////////////////////////////////////////////
    // Optional是不能序列化的，所以不建议使用在字段类型上。可以提供一个能访问声明为Optional的方法。
    //    public class Person {
    //         private Car car;
    //         public Optional<Car> getCarAsOptional() {
    //             return Optional.ofNullable(car);
    //         }
    //    }
    //  ① get()是这些方法中最简单但又最不安全的方法。如果变量存在，它直接返回封装的变量。
    //    除非你非常确定Optional 变量一定包含值，否则使用这个方法是个相当糟糕的主意。
    //  ② orElse(T other)，它允许你在 Optional对象不包含值时提供一个默认值。
    //  ③ orElseGet(Supplier<? extends T> other)，是orElse方法的延迟调用版，Supplier 方法只有在Optional对象不含值时才执行调用。如果创建默认值是件耗时费力的工作， 你应该考虑采用这种方式(借此提升程序的性能)
    //  ④ ifPresent(Consumer<? super T>)，在变量值存在时执行一个作为参数传入的 方法，否则就不进行任何操作。
    //  ⑤ orElseThrow(Supplier<? extends X> exceptionSupplier)，和get方法非常类似， 它们遭遇Optional对象为空时都会抛出一个异常，但是使用orElseThrow你可以定制希 望抛出的异常类型。
    ///////////////////////////////////////////////////////////////////////////


    /**
     * 获取名称
     *
     * @param p
     * @return
     */
    private static String getCompanyName(Optional<Person> p) {
        return p.flatMap(Person::getCar)
                .flatMap(Car::getInsurance)
                .map(Insurance::getName)
                .orElse("Unknow");


    }

    /**
     * 两个Optional对象的组合 传入的任何一个为空 则返回空
     *
     * @param
     * @return
     */
    private static Optional<Insurance> nullSafeFindCheapestInsurance(Optional<Person> person, Optional<Car> car) {
        return person.flatMap(p -> car.map(c -> findCheapestInsurance(p, c)));

    }

    public static Insurance findCheapestInsurance(Person person, Car car) {
        // 不同的保险公司提供的查询服务
        // 对比所有数据
        System.out.println("add dev_luozongting");


        return new Insurance();

    }

    /**
     * 过滤 出保险厂商是huawei的
     *
     * @param insurance
     */
    public static void checkCompanyName(Insurance insurance) {
        Optional<Insurance> isr = Optional.ofNullable(insurance);
        isr.filter(e -> "huawei".equals(e.getName()))
                .ifPresent(System.out::println);
    }


    public static void main(String[] args) {
        Person person = new Person();
        String companyName = getCompanyName(Optional.of(person));
        System.out.println("companyName = " + companyName);

        Insurance insurance = new Insurance();
        insurance.setName("huawei");
        checkCompanyName(insurance);

    }


}
